#include <iostream>
#include <queue>
#include <map>
#include <unordered_map>
#include <vector>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <set>
#include <unordered_set>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const int N=3010;
int p[N];
int v[N][11];
int dp[N][N][2];
int main()
{
	int n,k;
	cin>>n>>k;
	for(int i=1;i<=n;i++)
	{
		cin>>p[i];
		for(int j=1;j<=p[i];j++) 
		{
			scanf("%d",&v[i][j]);
		}
	}
	memset(dp,-0x3f,sizeof(dp));
	
	dp[0][0][0]=0;
	for(int i=1;i<=n;i++)
	{
		for(int j=k;j>=0;j--)
		{
			dp[i][j][0]=dp[i-1][j][0];
			dp[i][j][1]=dp[i-1][j][1];
			if(j+p[i]<=k)
			{
				dp[i][j+p[i]][0] = max(dp[i][j+p[i]][0],dp[i-1][j][0]+v[i][p[i]]);
				dp[i][j+p[i]][1] = max(dp[i][j+p[i]][1],dp[i-1][j][1]+v[i][p[i]]);
			}
			for(int z=1;z<p[i] && z+j<=k;z++)
			{
				dp[i][j+z][1]=max(dp[i][j+z][1],dp[i][j][0]+v[i][z]);
			}
		}
	}
	int ans = dp[n][k][1];
	for(int i=0;i<=k;i++)
	{
		ans=max(ans,dp[n][i][0]);
	}
	
	cout<<ans;

	return 0;
}

